// 删除二叉树中的某一个节点

var deleteNode = function(root, key) {
    if(!root) return null
    if(root.val == key) { // 节点一定在这删除
        if(root.left == null && root.right == null) return null
        if(root.left == null) return root.right
        if(root.right == null) return root.left

        if(root.left != null && root.right != null) {
            // 删除根节点后，判断目标值如果比当前节点大，就去右子树中删除，反之则去左子树中删除
        let target = getMinTreeMaxNode(root.left)
        root.val = target.val // 左子树中最大的值顶替掉根节点 (被删除的节点)
        root.left = deleteNode(root.left, target.val)  // 
        }
        return root
    }

    //  判断目标值如果比当前节点大，就去右子树中删除
    if(root.val < key) { 
        root.right = deleteNode(root.right, key)
    }
    // 就去左子树中删除
    if(root.val > key) {
        root.left = deleteNode(root.right, key)
    }

    // 找到左子树的最大值，按照二叉搜索树的性质，最大值一定在某个root的右子树上
    function getMinTreeMaxNode(root) {
        if (root.right == null) return root
        return getMinTreeMaxNode(root.right)
    }

    };